/* 
有 5 名选手： 选手 ABCDE， 10 个评委分别对每一名选手打分， 去除最高分， 去除
评委中最低分， 取平均分。
1. 创建五名选手， 放到 vector 中
2. 遍历 vector 容器， 取出来每一个选手， 执行 for 循环， 可以把 10 个评分打
分存到 deque 容器中
3. sort 算法对 deque 容器中分数排序， pop_back pop_front 去除最高和最低
分
4. deque 容器遍历一遍， 累加分数， 累加分数/d.size()
5. person.score = 平均分 
*/
#include <iostream>
#include "contestant.h"
#include <map>
#include <cstdlib>
#include <ctime>
#include <algorithm>

using namespace std;

/* deque遍历函数 */
void my_print(deque<int> d);


int main(int argc, char **argv)
{
    /* 变量定义 */
    map<int, Contestant> m;
    int i = 0;  /* 循环变量 */
    int j = 0;  /* 循环变量 */
    pair<int, Contestant> p;
    map<int, Contestant>::const_iterator mit;   /* map容器的迭代器 */
    deque<int>::iterator dit;   /* deque容器的迭代器 */
    Contestant tmp;


    /* 设置随机数种子 */
    srand(time(NULL));

    /* 初始化选手 */
    for (i = 1; i <= 5; i++)
    {
        switch (i)
        {
            case 1:
                p = make_pair(i, Contestant((char *)"A"));
                break;
            case 2:
                p = make_pair(i, Contestant((char *)"B"));
                break;
            case 3:
                p = make_pair(i, Contestant((char *)"C"));
                break;
            case 4:
                p = make_pair(i, Contestant((char *)"D"));
                break;
            case 5:
                p = make_pair(i, Contestant((char *)"E"));
                break;
        } /* end of switch (i) */
    
        /* 插入容器 */
        m.insert(p);
    } /* end of for (i = 1; i <= 5; i++) */

#ifdef DEBUG
    /* map初始化输出 */
    mit = m.begin();
    for (i = 0; i < 5; i++, mit++)
    {
        cout << (*mit).first << " ";
        tmp = (*mit).second;
        cout << tmp.getName() << endl;
    } /* end of for (i = 0; i < 5; i++) */
#endif


    /* 选手打分 */
    mit = m.begin();
    for (i = 0; i < 5; i++, mit++)
    {
        Contestant &tmp1 = (*mit).second;
        
        cout << "给选手" << tmp1.getName() << "评分" << endl;
        for (j = 0; j < 10; j++)
        {
            tmp1.pushScore(rand() % 10 + 1);
        } /* end of for (j = 0; j < 10; j++) */

    } /* end of for (i = 0; i < 5; i++) */

//#ifdef DEBUG
    /* 插入成绩测试 */
    mit = m.begin();
    for (i = 0; i < 5; i++, mit++)
    {
        cout << (*mit).first << " ";
        tmp = (*mit).second;
        cout << tmp.getName() << endl;

        cout << tmp.getScore().front() << endl;

        dit = tmp.getScore().begin();

        for (; dit != tmp.getScore().end(); dit++)
        {
            cout << *dit << " ";
        } /* end of for (; dit != tmp.getScore().end(); dit++) */
        cout << endl;

    } /* end of for (i = 0; i < 5; i++) */
//#endif


#if 0
    mit = m.begin();
    tmp = (*mit).second;
    cout << tmp.getScore().front() << endl;
    cout << (*mit).first << endl;
    cout << tmp.getName() << endl;
    my_print(tmp.getScore());

#if 0
    /* 分数排序 */
    mit = m.begin();
    for (i = 0; i < 5 ; i++) 
    {
        tmp = (*mit).second;
        //sort(tmp.getScore().begin(), tmp.getScore().end());

#ifdef DEBUG
        /* 遍历输出 */
        my_print(tmp.getScore());
#endif
        mit++;

    } /* end of for (i = 0; i < 5 ; i++) */
#endif

#endif
    return 0;
}

void my_print(deque<int> d)
{
    deque<int>::iterator it = d.begin();

    for (; it != d.end(); it++)
    {
        cout << *it << " ";
    } /* end of for (; it != d.end(); it++) */


    /* 换行 */
    cout << endl;

    return;
}
